#ifndef __M_LOGGER_H__
#define __M_LOGGER_H_
#include <iostream>
#include <cstdio>
#include <ctime>

#define NOR 0
#define DBG 1
#define ERR 2
#define DEFAULT_LOG_LEVEL DBG

// __VA_ARGS__ 是在 C99 中增加的新特性，允许定义具有可变数量参数的函数，但是 C89 中不允许这种定义可变数量参数的方式出现在宏定义中
// 官方定义: ANSI C 会自动将可变参数中相邻的两个字符串常量连接，如果它们之间没有逗号隔开的话。
#define LOG(level, format, ...) do\
{\
    if(level >= DEFAULT_LOG_LEVEL)\
    {\
        time_t t = time(nullptr);\
        struct tm *lt = localtime(&t);\
        char buffer[32] = {0};\
        strftime(buffer, sizeof buffer - 1, "%H:%M:%S", lt);\
        fprintf(stdout, "[%s %s:%d] " format "\n", buffer, __FILE__, __LINE__, ##__VA_ARGS__);\
    }\
}while(0);
//##用于合并两边的宏参数，可以在没有可变参数的情况下正常展开宏。如果##前面没有宏参数，则__VA_ARGS__会自动被忽略
//你甚至可以在外部这么调用LOG(); 并且不用传递任何参数，只会打印出来时分秒 文件名 行号的日志

#define NLOG(format, ...) LOG(NOR, format, ##__VA_ARGS__)
#define DLOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ELOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)

#endif